/*! \file DumperMallinfo.h
    \brief Une implementation d'un dumper permettant d'extraire les 
    informations sur l'allocateur.
    
*/
#ifndef __DUMPER_MALLINFO__
#define __DUMPER_MALLINFO__

//#include <malloc.h>
#include <unistd.h>
#include <strings.h>
#include <cstring>
#include "Dumper.h"
#include <cassert>



using namespace std;

/**
 *\brief structure de donnees stockant les informations issues de mallinfo
 *concernant un processus version de la libc.
 */
struct mallinfo {
  /**
   *\brief voir la documentation de la glibc
   */
  int arena;
  /**
   *\brief voir la documentation de la glibc
   */
  int ordblks;

  /**
   *\brief voir la documentation de la glibc
   */
  int smblks;
  /**
   *\brief voir la documentation de la glibc
   */
  int hblks;
  /**
   *\brief voir la documentation de la glibc
   */
  int hblkhd;
  /**
   *\brief voir la documentation de la glibc
   */
  int usmblks;
  /**
   *\brief voir la documentation de la glibc
   */
  int fsmblks;
  /**
   *\brief voir la documentation de la glibc
   */
  int uordblks;
  /**
   *\brief voir la documentation de la glibc
   */
  int fordblks;
  
  /**
   *\brief voir la documentation de la glibc
   */
  int keepcost;
};


typedef struct mallinfo mallinfo_t;


/**
 *\brief structure de donnees stockant les informations issues de mallinfo
 *concernant un processus.
 *@see struct mallinfo.
 */
typedef struct 
{
  /**
   *\brief voire la documentation de la glibc
   *@see struct mallinfo
   */
  mallinfo_t* infos;

  unsigned int pid;
}stats_mallinfo;



/**
 *\brief permet de dumper les informations issues de mallinfo.
 *\class DumperMallinfo permet de dumper les informations issues de mallinfo.
 */
class DumperMallinfo:public Dumper<stats_mallinfo>
{
  
 public:
  DumperMallinfo():Dumper<stats_mallinfo>("mallinfo.out")
    {
      instance.pid = (unsigned int) getpid();
      cout << "Profiling du processus "<<instance.pid << " par {mallinfo}" <<endl;		    			  
    }
  
  virtual void readLine()
    {
      /*mettre ss en variable d'instance et dans la methode readAndDump faire un clear avant le read de ss*/
      stringstream ss (stringstream::in | stringstream::out);
      
     
      
      
      /*Appel de mallinfo, retour par valeur*/
      mallinfo_t tmp=mallinfo ();
      
      
      /*Construction de la ligne à dumper*/
      ss << tmp.arena    <<   ESPACE << tmp.ordblks << ESPACE ;
      ss << tmp.smblks   <<   ESPACE << tmp.hblks   << ESPACE ;
      ss << tmp.hblkhd   <<   ESPACE << tmp.usmblks << ESPACE ;
      ss << tmp.fsmblks  <<   ESPACE << tmp.uordblks<< ESPACE ;
      ss << tmp.keepcost <<   ESPACE ;
      
      /*Cet appel doit être factorisé */
      this->lines.push_back(ss.str());
    }
};


#endif
